package cn.dlc.com.order.controller;

import cn.dlc.com.order.service.TestRuleService;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.netflix.discovery.converters.Auto;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author 邓立川
 * @date 2020/12/31 15:31
 * @desc 测试当前规则的类
 */
@RestController
@RequestMapping("test")
@Slf4j
public class TestRuleController {

    @Autowired
    private TestRuleService ruleService;

    int i= 0;
    // 流控规则测试方法

    // 测试普通流控规则
    @GetMapping("test1")
    public String test1(){
        log.info("普通流控规则测试方法..");
        return "普通流控规则测试方法";
    }


    // 流控模式为关联的测试方法
    @GetMapping("test2dot1")
    public String test2Dot1(){
        log.info("流控模式为关联的测试方法1..");
        return "流控模式为关联的测试方法1";
    }

    // 流控模式为关联的测试方法
    @GetMapping("test2dot2")
    public String test2Dot2(){
        log.info("流控模式为关联的测试方法2..");
        return "流控模式为关联的测试方法2";
    }


    // 用来测试流控效果为链路的测试类
    @GetMapping("test3dot1")
    public String test3Dot1(){
        log.info("用来测试流控效果为链路的测试类1..");
        ruleService.serviceMethod();
        return "用来测试流控效果为链路的测试类1";
    }
    // 用来测试流控效果为链路的测试类
    @GetMapping("test3dot2")
    public String test3Dot2(){
        log.info("用来测试流控效果为链路的测试类2..");
        ruleService.serviceMethod();
        return "用来测试流控效果为链路的测试类2";
    }

    // 流控规则测试方法结束-----------------------------------------------------------


    // 降级规则测试方法开始-----------------------------------------------------------
    // 降级规则测试方法
    @GetMapping("degrade/test")
    public String degradeTest(){
        log.info("降级测试..");
        i++ ;
        if(i %2 == 0) {
            int a = 0;
            int b = 1;
            int c = b/a;
        }
        return "降级测试";
    }

    // 降级规则测试方法结束-----------------------------------------------------------

    // 热点规则测试方法开始-----------------------------------------------------------
    @GetMapping("param/flow/test")
    // 必须添加这个，否则热点规则测试不生效
    @SentinelResource("paramFlowTest")
    public String paramFlowTest(String name, Integer age) {
        log.info("测试热点规则..");
        return "测试热点规则";
    }

    // 授权规则测试方法开始-----------------------------------------------------------
    @GetMapping("power/test")
    public String powerTest() {
        log.info("测试授权规则..");
        return "测试授权规则";
    }

}
